<?php

if (!defined("__WD__")) exit;

class Module_Mysql {

	/*
	 * 생성자
	 */

	function __construct() {
		
		include __APP__."/config/db.php";
		require_once __SYSTEM__."/helper/escape.php";
	
		@$this->conn = new Mysqli($config['dbhost'], $config['dbid'], $config['dbpw'], $config['dbname']);
		if ( $this->conn->connect_error ) throw new Exception("Wrong DB.");
		
		$this->conn->query("SET NAMES utf8");
	}	
	/*
	 * connect to db
	 */
	function escape( $var ) {
		return _escape($var);
	}
	function unescape( $var ) {
		return _unescape($var);
	}
	
	function query($sql, $args = null) {
		if ( is_array($args) ) {
			$items = explode("?", $sql);
			$ret = $items[0];
			$cnt = count($items)-1;
			try {
				if ( $cnt > count($args) ) throw new Error("충분한 매개변수가 필요합니다.");
			}
			catch (Error $e) {echo $e;exit;}
			for ($i = 0; $i < $cnt; $i++) {
				$ret .= "'"._escape($args[$i])."'".$items[$i+1];
			}
			if (__DEBUG__) p($ret);
			return $this->conn->query($ret);
		}
		else {
			if (__DEBUG__) p($sql);
			return $this->conn->query($sql);
		}
	}
	
	function result($sql, $args = null) {
		$ret = $this->query($sql, $args)->fetch_assoc();
		return _unescape($ret);
	}
	
	function fetch_assoc($sql, $args = null) {
		$result = $this->query($sql, $args);
		$rows = array();
		try {
			if ($result === false) throw new Error("잘못된 쿼리문입니다.");
		}
		catch (Error $e) {echo $e;exit;}
		while ( $row = $result->fetch_assoc() ) {
			array_push($rows, _unescape($row));
		}
		return $rows;
	}
	function fetch_assoc_one($sql, $args = null) {
		$result = $this->query($sql, $args);
		$rows = array();
		try {
			if ($result === false) throw new Error("잘못된 쿼리문입니다.");
		}
		catch (Error $e) {echo $e;exit;}
		while ( $row = $result->fetch_assoc() ) {
			$row = _unescape($row);
			array_push($rows, array_pop($row));
		}
		return $rows;
	}
	
	function count($sql, $args = null) {
		$rst = $this->result($sql, $args);
		return array_pop($rst);
	}


	function insert( $name, $val ) {
		try {
			if (!is_array($val)) throw new Error("2번째 parameter의 입력값이 배열이 아닙니다.");
			if (count($val) == 0) throw new Error("적어도 한개 이상의 내용이 포함되어 있어야 합니다.");
		
			// 없는값 기본값
			if ( !isset($val['reg_date']) ) $val['reg_date'] = time();
			if ( !isset($val['mod_date']) ) $val['mod_date'] = $val['reg_date'];
			if ($name == "wd_data" && is_null($val['ip']) ) $val['ip'] = $_SERVER['REMOTE_ADDR'];
			
			$keys = $values = array();
	
			foreach ( $val as $key => $value ) {
	
				array_push($keys, "`{$key}`");
				array_push($values, "'"._escape($value)."'");
	
			}
	
			// 쿼리구문 만들기
			$q = "INSERT INTO `{$name}` ( " . implode(", ", $keys) . " )
				VALUES ( " . implode(", ", $values) . " );";

			if (__DEBUG__) p($q);
			return $this->conn->query($q);

		}
		catch (Error $e) {echo $e;exit;}
	}
	
	function update( $name, $val, $search ) {
		try {
			if (!is_array($val)) throw new Error("2번째 parameter의 입력값이 배열이 아닙니다.");
			if (!is_array($search)) throw new Error("3번째 parameter의 입력값이 배열이 아닙니다.");
			if (count($val) == 0) throw new Error("적어도 한개 이상의 내용이 포함되어 있어야 합니다.");

			// 없는값 기본값
			if ( !isset($val['mod_date']) ) $val['mod_date'] = time();
			if ($name == "wd_data" && is_null($val['ip']) ) $val['ip'] = $_SERVER['REMOTE_ADDR'];
			
			$values = array();

			foreach ( $val as $key => $value ) {
	
				array_push($values, "`{$key}` = '"._escape($value)."'");
	
			}

			$srch = array();

			foreach ( $search as $key => $value ) {
	
				array_push($srch, "`{$key}` = '"._escape($value)."'");
	
			}
	
			// 쿼리구문 만들기
			$q = "update `{$name}` set " . implode(", ", $values) . " where ".implode(" and ", $srch) . ";";

			if (__DEBUG__) p($q);
			return $this->conn->query($q);

		}
		catch (Error $e) {echo $e;exit;}
	}
	
	function delete( $name, $search ) {
		try {
			if (!is_array($search)) throw new Error("2번째 parameter의 입력값이 배열이 아닙니다.");
			if (count($search) == 0) throw new Error("적어도 한개 이상의 내용이 포함되어 있어야 합니다.");

			// 없는값 기본값
			$srch = array();

			foreach ( $search as $key => $value ) {
	
				array_push($srch, "`{$key}` = '"._escape($value)."'");
	
			}
	
	
			// 쿼리구문 만들기
			$q = "delete from `{$name}` where ".implode(" and ", $srch) . " ;";

			if (__DEBUG__) p($q);
			return $this->conn->query($q);

		}
		catch (Error $e) {echo $e;exit;}
	}

// End Class
}


?>